"""
def 函数名(传入参数):
    函数体
    return 返回值

返回None时，在if中代表False
"""


def get_length(str1):
    """
    计算字符串长度
    :param str1: 待计算长度的字符串
    :return: 长度
    """
    count = 0
    for i in str1:
        count += 1
    return count


print(get_length("yysj"))


# -----------------------------------返回多个值------------------------------------------------------
def return_more():
    """
    返回多个值，使用逗号隔开
    :return: 返回值
    """
    return 1, 2


# 然后使用两个变量来接收
x, y = return_more()
print(x)
print(y)


# ------------------------------------传递多个参数--------------------------------------------------------
def pass_in_more(name, age, gender="男"):
    """
    传递多个参数
    :param name:
    :param age:
    :param gender:如果不传递，则默认为男，有默认值的参数必须在最后
    :return:
    """
    print(name, age, gender)


# 1.顺序传参
pass_in_more("张晗", 18, "女")

# 2.关键字传参，可以不按照顺序传递
pass_in_more(age=20, name="曹梓童", gender="男")


# ------------------------------------不定长参数---------------------------------------------------------
def user_info(*args):
    """
    不定长参数
    :param args: 可以传递任意个(元组类型)
    :return:
    """
    print(*args)


user_info("tom", 18)
user_info("jack")


# ------------------------------------关键字不定长参数--------------------------------------------------------
def user_info2(**kwargs):
    """
    关键字不定长参数
    :param kwargs: 可以传递任意个，但必须使用关键字说明(字典类型)
    :return:
    """
    print(kwargs)


user_info2(name="tom", age=18)
user_info2(name="jack")


# -------------------------------将函数作为参数传递-------------------------------------------------------------
def add(a, b):
    return a + b


def test_func(add1):
    """
    将函数作为参数传递
    :param add1:
    :return:
    """
    result = add1(1, 2)
    return result


print(test_func(add))

# -----------------------------------lambda函数----------------------------------------------------------
"""
lambda函数
lambda 参数:执行逻辑(一行)  只能使用一次
"""


def test_lambda(func):
    return func(1, 2)


test_lambda(lambda d, f: d + f)
